
/**
 * @desc: 实现拖拽模型，并且支持位置信息的数据持久。即这次拖到什么位置，下次打开还在这里。并且支持接收的容器
 * @params: {cfg}Object. 配置项:
 *     dom: 实现拖拽的元素，HTML dom 或者dom id。
 *     
 */
Bean.dragble = function(cfg){
	if(typeof cfg.dom=="string"){
		cfg.dom = Mao.$$(cfg.dom);
		if(!cfg.dom){return false;}
	}
	var dom = cfg.dom;
	/*
	鼠标在容器区域并且按下的时候打开计算开关，并且计算出鼠标相对容器的坐标
	鼠标在滑动的时候 如果计算开关打开，那么执行动态更新容器坐标
	鼠标在容器区域并且按键放开的时候开关关闭
	更新容器坐标的方法： 参数：1，事件e，2，容器div
	设置容器坐标为事件相对屏幕坐标减去事件相对容器坐标的差值
	*/
	var Pos = {
		open: false,
		c:{ x:null, y:null },//容器相对屏幕坐标
		m:{ x:null, y:null },//鼠标相对屏幕坐标
		m2c:{x:null, y:null} // 鼠标相对容器坐标
	}
	dom.onmousedown = function(e){
		e = e||window.event;
		Pos.open = true;//打开开关
		setM2C(this, e);//计算鼠标相对容器的值
	}
	dom.onmousemove = function(e){
		e = e||window.event;
		if(Pos.open){
			setCPosition(dom,e);
			//updatePosInfo(this)
		}
	}
	dom.onmouseup = function(e){ Pos.open = false; }
	//计算鼠标相对容器差值
	function setM2C(d, e){
		Pos.m2c = getMouseOffset(d, e)
	}
	//设置容器的显示位置
	function setCPosition(d, e){
		Pos.m = mouseCoords(e);
		d.style.position = "absolute";
		d.style.left = Pos.m.x-Pos.m2c.x;
		d.style.top = Pos.m.y-Pos.m2c.y;
	}
	//得到鼠标位置相对目标元素的top和left位置
	function getMouseOffset(target, ev){
		ev = ev || window.event;

		var docPos    = getPosition(target);
		var mousePos  = mouseCoords(ev);
		return {
			x:mousePos.x - docPos.x, 
			y:mousePos.y - docPos.y
		};
	}
	//得到容器相对屏幕的坐标信息
	function getPosition(dom){
		var left = 0;
		var top  = 0;
		while (dom.offsetParent){
			left += dom.offsetLeft + 
				(dom.currentStyle?NAN0(parseInt(dom.currentStyle.borderLeftWidth)):0);
			top += dom.offsetTop  + 
				(dom.currentStyle?NaN0(parseInt(dom.currentStyle.borderTopWidth)):0);
			dom = dom.offsetParent;
		}
		left += dom.offsetLeft + 
			(dom.currentStyle?NaN0(parseInt(dom.currentStyle.borderLeftWidth)):0);
		top += dom.offsetTop + 
			(dom.currentStyle?NaN0(parseInt(dom.currentStyle.borderTopWidth)):0);
		
		//console.info(left, top);
		return {x:left, y:top};
	}
	//得到鼠标相对屏幕的坐标信息
	function mouseCoords(ev){
		if(ev.pageX || ev.pageY){
			return {x:ev.pageX, y:ev.pageY};
		}
		return {
			x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
			y:ev.clientY + document.body.scrollTop  - document.body.clientTop
		};
	}
	//防止计算过程遇到非number值
	function NAN0(aNum){ return isNaN(aNum)?0:aNum; }
}


